Micron Document
NexusPi Git Node


Displaying Raw • Download

lib/microReticulum/src/Transport.h 3dacaa409b3a889ef8ab49d94d64daaebc7f77ac (3dacaa40) Text, 23.09 KB

Tff7b72#Tff7b72pragma once

Tff7b72#Tff7b72include T8b949e"Packet.h"
Tff7b72#Tff7b72include T8b949e"Bytes.h"
Tff7b72#Tff7b72include T8b949e"Type.h"

Tff7b72#Tff7b72include T8b949e<map>
Tff7b72#Tff7b72include T8b949e<vector>
Tff7b72#Tff7b72include T8b949e<deque>
Tff7b72#Tff7b72include T8b949e<list>
Tff7b72#Tff7b72include T8b949e<set>
Tff7b72#Tff7b72include T8b949e<array>
Tff7b72#Tff7b72include T8b949e<memory>
Tff7b72#Tff7b72include T8b949e<functional>
Tff7b72#Tff7b72include T8b949e<stdint.h>

T8b949e//#define INTERFACES_SET
T8b949e//#define INTERFACES_LIST
Tff7b72#Tff7b72define INTERFACES_MAP

T8b949e//#define DESTINATIONS_SET
Tff7b72#Tff7b72define DESTINATIONS_MAP

Te6edf3namespace Te6edf3RNS Tb4b4b4{

Te6edf3class Te6edf3ReticulumTb4b4b4;
Te6edf3class Te6edf3IdentityTb4b4b4;
Te6edf3class Te6edf3DestinationTb4b4b4;
Te6edf3class Te6edf3InterfaceTb4b4b4;
Te6edf3class Te6edf3LinkTb4b4b4;
Te6edf3class Te6edf3PacketTb4b4b4;
Te6edf3class Te6edf3PacketReceiptTb4b4b4;

Te6edf3class Te6edf3AnnounceHandler Tb4b4b4{
Te6edf3publicTff7b72:
T8b949e// The initialisation method takes the optional
T8b949e// aspect_filter argument. If aspect_filter is set to
T8b949e// None, all announces will be passed to the instance.
T8b949e// If only some announces are wanted, it can be set to
T8b949e// an aspect string.
Te6edf3AnnounceHandlerTb4b4b4(Tff7b72const Tffa657charTff7b72* Te6edf3aspect_filter Tff7b72= Tffa657nullptrTb4b4b4) Tb4b4b4{ Tff7b72if Tb4b4b4(Te6edf3aspect_filter Tff7b72!Tff7b72= Tffa657nullptrTb4b4b4) Te6edf3_aspect_filter Tff7b72= Te6edf3aspect_filterTb4b4b4; Tb4b4b4}
T8b949e// This method will be called by Reticulums Transport
T8b949e// system when an announce arrives that matches the
T8b949e// configured aspect filter. Filters must be specific,
T8b949e// and cannot use wildcards.
Te6edf3virtual Tffa657void Te6edf3received_announceTb4b4b4(Tff7b72const Te6edf3BytesTff7b72& Te6edf3destination_hashTb4b4b4, Tff7b72const Te6edf3IdentityTff7b72& Te6edf3announced_identityTb4b4b4, Tff7b72const Te6edf3BytesTff7b72& Te6edf3app_dataTb4b4b4) Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3stdTff7b72:Tff7b72:Te6edf3stringTff7b72& Td2a8ffaspect_filterTb4b4b4(Tb4b4b4) Tb4b4b4{ Tff7b72return Te6edf3_aspect_filterTb4b4b4; Tb4b4b4}
Te6edf3privateTff7b72:
Te6edf3stdTff7b72:Tff7b72:Te6edf3string Te6edf3_aspect_filterTb4b4b4;
Tb4b4b4}Tb4b4b4;
Te6edf3using Te6edf3HAnnounceHandler Tff7b72= Te6edf3stdTff7b72:Tff7b72:Te6edf3shared_ptrTff7b72<Te6edf3AnnounceHandlerTff7b72>Tb4b4b4;

T8b949e/*
Through static methods of this class you can interact with the
Transport system of Reticulum.
*/
Te6edf3class Te6edf3Transport Tb4b4b4{

Te6edf3publicTff7b72:
Te6edf3class Te6edf3Callbacks Tb4b4b4{
Te6edf3publicTff7b72:
Te6edf3using Te6edf3receive_packet Tff7b72= Tffa657voidTb4b4b4(Tff7b72*Tb4b4b4)Tb4b4b4(Tff7b72const Te6edf3BytesTff7b72& Te6edf3rawTb4b4b4, Tff7b72const Te6edf3InterfaceTff7b72& Te6edf3interfaceTb4b4b4)Tb4b4b4;
Te6edf3using Te6edf3transmit_packet Tff7b72= Tffa657voidTb4b4b4(Tff7b72*Tb4b4b4)Tb4b4b4(Tff7b72const Te6edf3BytesTff7b72& Te6edf3rawTb4b4b4, Tff7b72const Te6edf3InterfaceTff7b72& Te6edf3interfaceTb4b4b4)Tb4b4b4;
Te6edf3using Te6edf3filter_packet Tff7b72= Tffa657boolTb4b4b4(Tff7b72*Tb4b4b4)Tb4b4b4(Tff7b72const Te6edf3PacketTff7b72& Te6edf3packetTb4b4b4)Tb4b4b4;
Te6edf3publicTff7b72:
Te6edf3receive_packet Te6edf3_receive_packet Tff7b72= Tffa657nullptrTb4b4b4;
Te6edf3transmit_packet Te6edf3_transmit_packet Tff7b72= Tffa657nullptrTb4b4b4;
Te6edf3filter_packet Te6edf3_filter_packet Tff7b72= Tffa657nullptrTb4b4b4;
Te6edf3friend Te6edf3class Te6edf3TransportTb4b4b4;
Tb4b4b4}Tb4b4b4;

Te6edf3publicTff7b72:

Te6edf3class Te6edf3PacketEntry Tb4b4b4{
Te6edf3publicTff7b72:
Te6edf3PacketEntryTb4b4b4(Tb4b4b4) Tb4b4b4{Tb4b4b4}
Te6edf3PacketEntryTb4b4b4(Tff7b72const Te6edf3BytesTff7b72& Te6edf3rawTb4b4b4, Tffa657double Te6edf3sent_atTb4b4b4, Tff7b72const Te6edf3BytesTff7b72& Te6edf3destination_hashTb4b4b4) Tff7b72:
Te6edf3_rawTb4b4b4(Te6edf3rawTb4b4b4)Tb4b4b4,
Te6edf3_sent_atTb4b4b4(Te6edf3sent_atTb4b4b4)Tb4b4b4,
Te6edf3_destination_hashTb4b4b4(Te6edf3destination_hashTb4b4b4)
Tb4b4b4{
Tb4b4b4}
Te6edf3PacketEntryTb4b4b4(Tff7b72const Te6edf3PacketTff7b72& Te6edf3packetTb4b4b4) Tff7b72:
Te6edf3_rawTb4b4b4(Te6edf3packetTb4b4b4.Te6edf3rawTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4,
Te6edf3_sent_atTb4b4b4(Te6edf3packetTb4b4b4.Te6edf3sent_atTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4,
Te6edf3_destination_hashTb4b4b4(Te6edf3packetTb4b4b4.Te6edf3destination_hashTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4,
Te6edf3_receiving_interfaceTb4b4b4(Te6edf3packetTb4b4b4.Te6edf3receiving_interfaceTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4{
Tb4b4b4}
Te6edf3publicTff7b72:
Te6edf3Bytes Te6edf3_rawTb4b4b4;
Tffa657double Te6edf3_sent_at Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3Bytes Te6edf3_destination_hashTb4b4b4;
Te6edf3Interface Te6edf3_receiving_interface Tff7b72= Tb4b4b4{Te6edf3TypeTff7b72:Tff7b72:Te6edf3NONETb4b4b4}Tb4b4b4;
Tffa657bool Te6edf3_cached Tff7b72= Tffa657falseTb4b4b4;
Tff7b72#Tff7b72ifndef NDEBUG
Tff7b72inline Te6edf3stdTff7b72:Tff7b72:Te6edf3string Td2a8ffdebugStringTb4b4b4(Tb4b4b4) Tff7b72const Tb4b4b4{
Te6edf3stdTff7b72:Tff7b72:Te6edf3string Te6edf3dumpTb4b4b4;
Te6edf3dump Tff7b72= Ta5d6ff"Ta5d6ffPacketEntry: destination_hash=Ta5d6ff" Tff7b72+ Te6edf3_destination_hashTb4b4b4.Te6edf3toHexTb4b4b4(Tb4b4b4) Tff7b72+
Ta5d6ff"Ta5d6ff sent_at=Ta5d6ff" Tff7b72+ Te6edf3stdTff7b72:Tff7b72:Te6edf3to_stringTb4b4b4(Te6edf3_sent_atTb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3dumpTb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72endif
Tb4b4b4}Tb4b4b4;

T8b949e// ── Multi-Path Path Table ───────────────────────────────────────
T8b949e// Each announce inserts a PathEntry (no quality gate — all valid
T8b949e// announces coexist). At forwarding time, select_path() picks the
T8b949e// best entry by score = bitrate / (hops+1).
T8b949e// Replaces the old single-entry DestinationEntry path table.
Te6edf3class Te6edf3PathEntry Tb4b4b4{
Te6edf3publicTff7b72:
Te6edf3PathEntryTb4b4b4(Tb4b4b4) Tb4b4b4{Tb4b4b4}
Te6edf3PathEntryTb4b4b4(Tffa657double Te6edf3timestampTb4b4b4, Tff7b72const Te6edf3BytesTff7b72& Te6edf3next_hopTb4b4b4, Tffa657uint8_t Te6edf3hopsTb4b4b4, Tffa657double Te6edf3expiresTb4b4b4, Tff7b72const Te6edf3BytesTff7b72& Te6edf3receiving_interfaceTb4b4b4, Tff7b72const Te6edf3BytesTff7b72& Te6edf3packet_hashTb4b4b4) Tff7b72:
Te6edf3timestampTb4b4b4(Te6edf3timestampTb4b4b4)Tb4b4b4,
Te6edf3next_hopTb4b4b4(Te6edf3next_hopTb4b4b4)Tb4b4b4,
Te6edf3hopsTb4b4b4(Te6edf3hopsTb4b4b4)Tb4b4b4,
Te6edf3expiresTb4b4b4(Te6edf3expiresTb4b4b4)Tb4b4b4,
Te6edf3receiving_interfaceTb4b4b4(Te6edf3receiving_interfaceTb4b4b4)Tb4b4b4,
Te6edf3packet_hashTb4b4b4(Te6edf3packet_hashTb4b4b4)
Tb4b4b4{
Tb4b4b4}
T8b949e/// Score = bitrate / (hops+1). Higher is better.
T8b949e/// Falls back to 1000 bps when interface bitrate is unknown.
Tffa657double Te6edf3scoreTb4b4b4(Tffa657uint32_t Te6edf3iface_bitrateTb4b4b4) Tff7b72const Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3iface_bitrate Tff7b72=Tff7b72= T79c0ff0Tb4b4b4) Te6edf3iface_bitrate Tff7b72= T79c0ff1000Tb4b4b4;
Tff7b72return Tb4b4b4(Tffa657doubleTb4b4b4)Te6edf3iface_bitrate Tff7b72/ Tb4b4b4(Tffa657doubleTb4b4b4)Tb4b4b4(Te6edf3hops Tff7b72+ T79c0ff1Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72inline Tffa657bool Te6edf3is_expiredTb4b4b4(Tffa657double Te6edf3nowTb4b4b4) Tff7b72const Tb4b4b4{ Tff7b72return Te6edf3now Tff7b72>Tff7b72= Te6edf3expiresTb4b4b4; Tb4b4b4}

Te6edf3publicTff7b72:
Tffa657double Te6edf3timestamp Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3Bytes Te6edf3next_hopTb4b4b4;
Tffa657uint8_t Te6edf3hops Tff7b72= T79c0ff0Tb4b4b4;
Tffa657double Te6edf3expires Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3Bytes Te6edf3receiving_interfaceTb4b4b4; T8b949e// interface hash
Te6edf3Bytes Te6edf3packet_hashTb4b4b4; T8b949e// for per-dest dedup
Tff7b72#Tff7b72ifndef NDEBUG
Tff7b72inline Te6edf3stdTff7b72:Tff7b72:Te6edf3string Td2a8ffdebugStringTb4b4b4(Tb4b4b4) Tff7b72const Tb4b4b4{
Te6edf3stdTff7b72:Tff7b72:Te6edf3string Te6edf3dumpTb4b4b4;
Te6edf3dump Tff7b72= Ta5d6ff"Ta5d6ffPathEntry: ts=Ta5d6ff" Tff7b72+ Te6edf3stdTff7b72:Tff7b72:Te6edf3to_stringTb4b4b4(Te6edf3timestampTb4b4b4) Tff7b72+
Ta5d6ff"Ta5d6ff nh=Ta5d6ff" Tff7b72+ Te6edf3next_hopTb4b4b4.Te6edf3toHexTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3substrTb4b4b4(T79c0ff0Tb4b4b4,T79c0ff8Tb4b4b4) Tff7b72+
Ta5d6ff"Ta5d6ff hops=Ta5d6ff" Tff7b72+ Te6edf3stdTff7b72:Tff7b72:Te6edf3to_stringTb4b4b4(Te6edf3hopsTb4b4b4) Tff7b72+
Ta5d6ff"Ta5d6ff exp=Ta5d6ff" Tff7b72+ Te6edf3stdTff7b72:Tff7b72:Te6edf3to_stringTb4b4b4(Te6edf3expiresTb4b4b4) Tff7b72+
Ta5d6ff"Ta5d6ff iface=Ta5d6ff" Tff7b72+ Te6edf3receiving_interfaceTb4b4b4.Te6edf3toHexTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3substrTb4b4b4(T79c0ff0Tb4b4b4,T79c0ff8Tb4b4b4) Tff7b72+
Ta5d6ff"Ta5d6ff pkt=Ta5d6ff" Tff7b72+ Te6edf3packet_hashTb4b4b4.Te6edf3toHexTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3substrTb4b4b4(T79c0ff0Tb4b4b4,T79c0ff8Tb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3dumpTb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72endif
Tb4b4b4}Tb4b4b4;

T8b949e/// Max alternative paths stored per destination (N=3).
Tff7b72static Tff7b72const Tffa657size_t Te6edf3MAX_PATHS_PER_DEST Tff7b72= T79c0ff3Tb4b4b4;
T8b949e/// Max entries in the global anti-replay blob set.
Tff7b72static Tff7b72const Tffa657size_t Te6edf3MAX_GLOBAL_BLOBS Tff7b72= T79c0ff16Tb4b4b4;

T8b949e// ── Legacy DestinationEntry (kept for tunnel path serialization) ──
T8b949e// CBA TODO Analyze safety of using Interface references here
T8b949e// CBA TODO Analyze safety of using Packet references here
Te6edf3class Te6edf3DestinationEntry Tb4b4b4{
Te6edf3publicTff7b72:
Te6edf3DestinationEntryTb4b4b4(Tb4b4b4) Tb4b4b4{Tb4b4b4}
Te6edf3DestinationEntryTb4b4b4(Tffa657double Te6edf3timestampTb4b4b4, Tff7b72const Te6edf3BytesTff7b72& Te6edf3received_fromTb4b4b4, Tffa657uint8_t Te6edf3announce_hopsTb4b4b4, Tffa657double Te6edf3expiresTb4b4b4, Tff7b72const Te6edf3stdTff7b72:Tff7b72:Te6edf3setTff7b72<Te6edf3BytesTff7b72>Tff7b72& Te6edf3random_blobsTb4b4b4, Tff7b72const Te6edf3BytesTff7b72& Te6edf3receiving_interfaceTb4b4b4, Tff7b72const Te6edf3BytesTff7b72& Te6edf3packetTb4b4b4) Tff7b72:
Te6edf3_timestampTb4b4b4(Te6edf3timestampTb4b4b4)Tb4b4b4,
Te6edf3_received_fromTb4b4b4(Te6edf3received_fromTb4b4b4)Tb4b4b4,
Te6edf3_hopsTb4b4b4(Te6edf3announce_hopsTb4b4b4)Tb4b4b4,
Te6edf3_expiresTb4b4b4(Te6edf3expiresTb4b4b4)Tb4b4b4,
Te6edf3_random_blobsTb4b4b4(Te6edf3random_blobsTb4b4b4)Tb4b4b4,
Te6edf3_receiving_interfaceTb4b4b4(Te6edf3receiving_interfaceTb4b4b4)Tb4b4b4,
Te6edf3_announce_packetTb4b4b4(Te6edf3packetTb4b4b4)
Tb4b4b4{
Tb4b4b4}
Te6edf3publicTff7b72:
Tff7b72inline Te6edf3Interface Te6edf3receiving_interfaceTb4b4b4(Tb4b4b4) Tff7b72const Tb4b4b4{ Tff7b72return Te6edf3find_interface_from_hashTb4b4b4(Te6edf3_receiving_interfaceTb4b4b4)Tb4b4b4; Tb4b4b4}
Tff7b72inline Te6edf3Packet Te6edf3announce_packetTb4b4b4(Tb4b4b4) Tff7b72const Tb4b4b4{ Tff7b72return Te6edf3get_cached_packetTb4b4b4(Te6edf3_announce_packetTb4b4b4)Tb4b4b4; Tb4b4b4}
Te6edf3publicTff7b72:
Tffa657double Te6edf3_timestamp Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3Bytes Te6edf3_received_fromTb4b4b4;
Tffa657uint8_t Te6edf3_hops Tff7b72= T79c0ff0Tb4b4b4;
Tffa657double Te6edf3_expires Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3stdTff7b72:Tff7b72:Te6edf3setTff7b72<Te6edf3BytesTff7b72> Te6edf3_random_blobsTb4b4b4;
T8b949e//Interface _receiving_interface = {Type::NONE};
Te6edf3Bytes Te6edf3_receiving_interfaceTb4b4b4;
T8b949e//const Packet& _announce_packet;
T8b949e//Packet _announce_packet = {Type::NONE};
Te6edf3Bytes Te6edf3_announce_packetTb4b4b4;
Tff7b72inline Tffa657bool Te6edf3operator Tff7b72< Tb4b4b4(Tff7b72const Te6edf3DestinationEntryTff7b72& Te6edf3entryTb4b4b4) Tff7b72const Tb4b4b4{
T8b949e// sort by ascending timestamp (oldest entries at the top)
Tff7b72return Te6edf3_timestamp Tff7b72< Te6edf3entryTb4b4b4.Te6edf3_timestampTb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72ifndef NDEBUG
Tff7b72inline Te6edf3stdTff7b72:Tff7b72:Te6edf3string Te6edf3debugStringTb4b4b4(Tb4b4b4) Tff7b72const Tb4b4b4{
Te6edf3stdTff7b72:Tff7b72:Te6edf3string Te6edf3dumpTb4b4b4;
Te6edf3dump Tff7b72= Ta5d6ff"Ta5d6ffDestinationEntry: timestamp=Ta5d6ff" Tff7b72+ Te6edf3stdTff7b72:Tff7b72:Te6edf3to_stringTb4b4b4(Te6edf3_timestampTb4b4b4) Tff7b72+
Ta5d6ff"Ta5d6ff received_from=Ta5d6ff" Tff7b72+ Te6edf3_received_fromTb4b4b4.Te6edf3toHexTb4b4b4(Tb4b4b4) Tff7b72+
Ta5d6ff"Ta5d6ff hops=Ta5d6ff" Tff7b72+ Te6edf3stdTff7b72:Tff7b72:Te6edf3to_stringTb4b4b4(Te6edf3_hopsTb4b4b4) Tff7b72+
Ta5d6ff"Ta5d6ff expires=Ta5d6ff" Tff7b72+ Te6edf3stdTff7b72:Tff7b72:Te6edf3to_stringTb4b4b4(Te6edf3_expiresTb4b4b4) Tff7b72+
T8b949e//" random_blobs=" + _random_blobs +
Ta5d6ff"Ta5d6ff receiving_interface=Ta5d6ff" Tff7b72+ Te6edf3_receiving_interfaceTb4b4b4.Te6edf3toHexTb4b4b4(Tb4b4b4) Tff7b72+
Ta5d6ff"Ta5d6ff announce_packet=Ta5d6ff" Tff7b72+ Te6edf3_announce_packetTb4b4b4.Te6edf3toHexTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3dump Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff random_blobs=(Ta5d6ff"Tb4b4b4;
Tff7b72for Tb4b4b4(Tff7b72autoTff7b72& Te6edf3blob Tff7b72: Te6edf3_random_blobsTb4b4b4) Tb4b4b4{
Te6edf3dump Tff7b72+Tff7b72= Te6edf3blobTb4b4b4.Te6edf3toHexTb4b4b4(Tb4b4b4) Tff7b72+ Ta5d6ff"Ta5d6ff,Ta5d6ff"Tb4b4b4;
Tb4b4b4}
Te6edf3dump Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff)Ta5d6ff"Tb4b4b4;
Tff7b72return Te6edf3dumpTb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72endif
Tb4b4b4}Tb4b4b4;

T8b949e// CBA TODO Analyze safety of using Inrerface references here
T8b949e// CBA TODO Analyze safety of using Packet references here
Te6edf3class Te6edf3AnnounceEntry Tb4b4b4{
Te6edf3publicTff7b72:
Te6edf3AnnounceEntryTb4b4b4(Tffa657double Te6edf3timestampTb4b4b4, Tffa657double Te6edf3retransmit_timeoutTb4b4b4, Tffa657uint8_t Te6edf3retriesTb4b4b4, Tff7b72const Te6edf3BytesTff7b72& Te6edf3received_fromTb4b4b4, Tffa657uint8_t Te6edf3hopsTb4b4b4, Tff7b72const Te6edf3PacketTff7b72& Te6edf3packetTb4b4b4, Tffa657uint8_t Te6edf3local_rebroadcastsTb4b4b4, Tffa657bool Te6edf3block_rebroadcastsTb4b4b4, Tff7b72const Te6edf3InterfaceTff7b72& Te6edf3attached_interfaceTb4b4b4) Tff7b72:
Te6edf3_timestampTb4b4b4(Te6edf3timestampTb4b4b4)Tb4b4b4,
Te6edf3_retransmit_timeoutTb4b4b4(Te6edf3retransmit_timeoutTb4b4b4)Tb4b4b4,
Te6edf3_retriesTb4b4b4(Te6edf3retriesTb4b4b4)Tb4b4b4,
Te6edf3_received_fromTb4b4b4(Te6edf3received_fromTb4b4b4)Tb4b4b4,
Te6edf3_hopsTb4b4b4(Te6edf3hopsTb4b4b4)Tb4b4b4,
Te6edf3_packetTb4b4b4(Te6edf3packetTb4b4b4)Tb4b4b4,
Te6edf3_local_rebroadcastsTb4b4b4(Te6edf3local_rebroadcastsTb4b4b4)Tb4b4b4,
Te6edf3_block_rebroadcastsTb4b4b4(Te6edf3block_rebroadcastsTb4b4b4)Tb4b4b4,
Te6edf3_attached_interfaceTb4b4b4(Te6edf3attached_interfaceTb4b4b4)
Tb4b4b4{
Tb4b4b4}
Te6edf3publicTff7b72:
Tffa657double Te6edf3_timestamp Tff7b72= T79c0ff0Tb4b4b4;
Tffa657double Te6edf3_retransmit_timeout Tff7b72= T79c0ff0Tb4b4b4;
Tffa657uint8_t Te6edf3_retries Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72const Te6edf3Bytes Te6edf3_received_fromTb4b4b4;
Tffa657uint8_t Te6edf3_hops Tff7b72= T79c0ff0Tb4b4b4;
T8b949e// CBA Storing packet reference causes memory issues, presumably because orignal packet is being destroyed
T8b949e// MUST use instance instad of reference!!!
T8b949e//const Packet& _packet;
Tff7b72const Te6edf3Packet Te6edf3_packet Tff7b72= Tb4b4b4{Te6edf3TypeTff7b72:Tff7b72:Te6edf3NONETb4b4b4}Tb4b4b4;
Tffa657uint8_t Te6edf3_local_rebroadcasts Tff7b72= T79c0ff0Tb4b4b4;
Tffa657bool Te6edf3_block_rebroadcasts Tff7b72= Tffa657falseTb4b4b4;
Tff7b72const Te6edf3Interface Te6edf3_attached_interface Tff7b72= Tb4b4b4{Te6edf3TypeTff7b72:Tff7b72:Te6edf3NONETb4b4b4}Tb4b4b4;
Tb4b4b4}Tb4b4b4;

T8b949e// CBA TODO Analyze safety of using Inrerface references here
Te6edf3class Te6edf3LinkEntry Tb4b4b4{
Te6edf3publicTff7b72:
Te6edf3LinkEntryTb4b4b4(Tffa657double Te6edf3timestampTb4b4b4, Tff7b72const Te6edf3BytesTff7b72& Te6edf3next_hopTb4b4b4, Tff7b72const Te6edf3InterfaceTff7b72& Te6edf3outbound_interfaceTb4b4b4, Tffa657uint8_t Te6edf3remaining_hopsTb4b4b4, Tff7b72const Te6edf3InterfaceTff7b72& Te6edf3receiving_interfaceTb4b4b4, Tffa657uint8_t Te6edf3hopsTb4b4b4, Tff7b72const Te6edf3BytesTff7b72& Te6edf3destination_hashTb4b4b4, Tffa657bool Te6edf3validatedTb4b4b4, Tffa657double Te6edf3proof_timeoutTb4b4b4) Tff7b72:
Te6edf3_timestampTb4b4b4(Te6edf3timestampTb4b4b4)Tb4b4b4,
Te6edf3_next_hopTb4b4b4(Te6edf3next_hopTb4b4b4)Tb4b4b4,
Te6edf3_outbound_interfaceTb4b4b4(Te6edf3outbound_interfaceTb4b4b4)Tb4b4b4,
Te6edf3_remaining_hopsTb4b4b4(Te6edf3remaining_hopsTb4b4b4)Tb4b4b4,
Te6edf3_receiving_interfaceTb4b4b4(Te6edf3receiving_interfaceTb4b4b4)Tb4b4b4,
Te6edf3_hopsTb4b4b4(Te6edf3hopsTb4b4b4)Tb4b4b4,
Te6edf3_destination_hashTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4,
Te6edf3_validatedTb4b4b4(Te6edf3validatedTb4b4b4)Tb4b4b4,
Te6edf3_proof_timeoutTb4b4b4(Te6edf3proof_timeoutTb4b4b4)
Tb4b4b4{
Tb4b4b4}
Te6edf3publicTff7b72:
Tffa657double Te6edf3_timestamp Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72const Te6edf3Bytes Te6edf3_next_hopTb4b4b4;
Tff7b72const Te6edf3Interface Te6edf3_outbound_interface Tff7b72= Tb4b4b4{Te6edf3TypeTff7b72:Tff7b72:Te6edf3NONETb4b4b4}Tb4b4b4;
Tffa657uint8_t Te6edf3_remaining_hops Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3Interface Te6edf3_receiving_interface Tff7b72= Tb4b4b4{Te6edf3TypeTff7b72:Tff7b72:Te6edf3NONETb4b4b4}Tb4b4b4;
Tffa657uint8_t Te6edf3_hops Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72const Te6edf3Bytes Te6edf3_destination_hashTb4b4b4;
Tffa657bool Te6edf3_validated Tff7b72= Tffa657falseTb4b4b4;
Tffa657double Te6edf3_proof_timeout Tff7b72= T79c0ff0Tb4b4b4;
Tb4b4b4}Tb4b4b4;

T8b949e// CBA TODO Analyze safety of using Inrerface references here
Te6edf3class Te6edf3ReverseEntry Tb4b4b4{
Te6edf3publicTff7b72:
Te6edf3ReverseEntryTb4b4b4(Tff7b72const Te6edf3InterfaceTff7b72& Te6edf3receiving_interfaceTb4b4b4, Tff7b72const Te6edf3InterfaceTff7b72& Te6edf3outbound_interfaceTb4b4b4, Tffa657double Te6edf3timestampTb4b4b4) Tff7b72:
Te6edf3_receiving_interfaceTb4b4b4(Te6edf3receiving_interfaceTb4b4b4)Tb4b4b4,
Te6edf3_outbound_interfaceTb4b4b4(Te6edf3outbound_interfaceTb4b4b4)Tb4b4b4,
Te6edf3_timestampTb4b4b4(Te6edf3timestampTb4b4b4)
Tb4b4b4{
Tb4b4b4}
Te6edf3publicTff7b72:
Te6edf3Interface Te6edf3_receiving_interface Tff7b72= Tb4b4b4{Te6edf3TypeTff7b72:Tff7b72:Te6edf3NONETb4b4b4}Tb4b4b4;
Te6edf3Interface Te6edf3_outbound_interface Tff7b72= Tb4b4b4{Te6edf3TypeTff7b72:Tff7b72:Te6edf3NONETb4b4b4}Tb4b4b4;
Tffa657double Te6edf3_timestamp Tff7b72= T79c0ff0Tb4b4b4;
Tb4b4b4}Tb4b4b4;

T8b949e// CBA TODO Analyze safety of using Inrerface references here
Te6edf3class Te6edf3PathRequestEntry Tb4b4b4{
Te6edf3publicTff7b72:
Te6edf3PathRequestEntryTb4b4b4(Tff7b72const Te6edf3BytesTff7b72& Te6edf3destination_hashTb4b4b4, Tffa657double Te6edf3timeoutTb4b4b4, Tff7b72const Te6edf3InterfaceTff7b72& Te6edf3requesting_interfaceTb4b4b4) Tff7b72:
Te6edf3_destination_hashTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4,
Te6edf3_timeoutTb4b4b4(Te6edf3timeoutTb4b4b4)Tb4b4b4,
Te6edf3_requesting_interfaceTb4b4b4(Te6edf3requesting_interfaceTb4b4b4)
Tb4b4b4{
Tb4b4b4}
Te6edf3publicTff7b72:
Te6edf3Bytes Te6edf3_destination_hashTb4b4b4;
Tffa657double Te6edf3_timeout Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3Interface Te6edf3_requesting_interface Tff7b72= Tb4b4b4{Te6edf3TypeTff7b72:Tff7b72:Te6edf3NONETb4b4b4}Tb4b4b4;
Tb4b4b4}Tb4b4b4;

T8b949e/*
// CBA TODO Analyze safety of using Inrerface references here
class SerialisedEntry {
public:
SerialisedEntry(const Bytes& destination_hash, double timestamp, const Bytes& received_from, uint8_t announce_hops, double expires, const std::set<Bytes>& random_blobs, Interface& receiving_interface, const Packet& packet) :
_destination_hash(destination_hash),
_timestamp(timestamp),
_hops(announce_hops),
_expires(expires),
_random_blobs(random_blobs),
_receiving_interface(receiving_interface),
_announce_packet(packet)
{
}
public:
const Bytes _destination_hash;
double _timestamp = 0;
const Bytes _received_from;
uint8_t _hops = 0;
double _expires = 0;
std::set<Bytes> _random_blobs;
Interface _receiving_interface = {Type::NONE};
Packet _announce_packet = {Type::NONE};
};
*/

T8b949e// CBA TODO Analyze safety of using Inrerface references here
Te6edf3class Te6edf3TunnelEntry Tb4b4b4{
Te6edf3publicTff7b72:
Te6edf3TunnelEntryTb4b4b4(Tff7b72const Te6edf3BytesTff7b72& Te6edf3tunnel_idTb4b4b4, Tff7b72const Te6edf3BytesTff7b72& Te6edf3interface_hashTb4b4b4, Tffa657double Te6edf3expiresTb4b4b4) Tff7b72:
Te6edf3_tunnel_idTb4b4b4(Te6edf3tunnel_idTb4b4b4)Tb4b4b4,
Te6edf3_interface_hashTb4b4b4(Te6edf3interface_hashTb4b4b4)Tb4b4b4,
Te6edf3_expiresTb4b4b4(Te6edf3expiresTb4b4b4)
Tb4b4b4{
Tb4b4b4}
Te6edf3publicTff7b72:
Tff7b72const Te6edf3Bytes Te6edf3_tunnel_idTb4b4b4;
Tff7b72const Te6edf3Bytes Te6edf3_interface_hashTb4b4b4;
Te6edf3stdTff7b72:Tff7b72:Te6edf3mapTff7b72<Te6edf3BytesTb4b4b4, Te6edf3DestinationEntryTff7b72> Te6edf3_serialised_pathsTb4b4b4;
Tffa657double Te6edf3_expires Tff7b72= T79c0ff0Tb4b4b4;
Tb4b4b4}Tb4b4b4;

Te6edf3class Te6edf3RateEntry Tb4b4b4{
Te6edf3publicTff7b72:
Te6edf3RateEntryTb4b4b4(Tffa657double Te6edf3nowTb4b4b4) Tff7b72:
Te6edf3_lastTb4b4b4(Te6edf3nowTb4b4b4)
Tb4b4b4{
Te6edf3_timestampsTb4b4b4.Te6edf3push_backTb4b4b4(Te6edf3nowTb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3publicTff7b72:
Tffa657double Te6edf3_last Tff7b72= T79c0ff0.0Tb4b4b4;
Tffa657double Te6edf3_rate_violations Tff7b72= T79c0ff0.0Tb4b4b4;
Tffa657double Te6edf3_blocked_until Tff7b72= T79c0ff0.0Tb4b4b4;
Te6edf3stdTff7b72:Tff7b72:Te6edf3vectorTff7b72<Tffa657doubleTff7b72> Te6edf3_timestampsTb4b4b4;
Tb4b4b4}Tb4b4b4;

Te6edf3publicTff7b72:
Tff7b72static Tffa657void Te6edf3startTb4b4b4(Tff7b72const Te6edf3ReticulumTff7b72& Te6edf3reticulum_instanceTb4b4b4)Tb4b4b4;
Tff7b72static Tffa657void Td2a8ffloopTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72static Tffa657void Td2a8ffjobsTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72static Tffa657void Td2a8fftransmitTb4b4b4(Te6edf3InterfaceTff7b72& Te6edf3interfaceTb4b4b4, Tff7b72const Te6edf3BytesTff7b72& Te6edf3rawTb4b4b4)Tb4b4b4;
Tff7b72static Tffa657bool Td2a8ffoutboundTb4b4b4(Te6edf3PacketTff7b72& Te6edf3packetTb4b4b4)Tb4b4b4;
Tff7b72static Tffa657bool Td2a8ffpacket_filterTb4b4b4(Tff7b72const Te6edf3PacketTff7b72& Te6edf3packetTb4b4b4)Tb4b4b4;
T8b949e//static void inbound(const Bytes& raw, const Interface& interface = {Type::NONE});
Tff7b72static Tffa657void Td2a8ffinboundTb4b4b4(Tff7b72const Te6edf3BytesTff7b72& Te6edf3rawTb4b4b4, Tff7b72const Te6edf3InterfaceTff7b72& Te6edf3interfaceTb4b4b4)Tb4b4b4;
Tff7b72static Tffa657void Td2a8ffinboundTb4b4b4(Tff7b72const Te6edf3BytesTff7b72& Te6edf3rawTb4b4b4)Tb4b4b4;
Tff7b72static Tffa657void Td2a8ffsynthesize_tunnelTb4b4b4(Tff7b72const Te6edf3InterfaceTff7b72& Te6edf3interfaceTb4b4b4)Tb4b4b4;
Tff7b72static Tffa657void Td2a8fftunnel_synthesize_handlerTb4b4b4(Tff7b72const Te6edf3BytesTff7b72& Te6edf3dataTb4b4b4, Tff7b72const Te6edf3PacketTff7b72& Te6edf3packetTb4b4b4)Tb4b4b4;
Tff7b72static Tffa657void Td2a8ffhandle_tunnelTb4b4b4(Tff7b72const Te6edf3BytesTff7b72& Te6edf3tunnel_idTb4b4b4, Tff7b72const Te6edf3InterfaceTff7b72& Te6edf3interfaceTb4b4b4)Tb4b4b4;
Tff7b72static Tffa657void Td2a8ffregister_interfaceTb4b4b4(Te6edf3InterfaceTff7b72& Te6edf3interfaceTb4b4b4)Tb4b4b4;
Tff7b72static Tffa657void Td2a8ffderegister_interfaceTb4b4b4(Tff7b72const Te6edf3InterfaceTff7b72& Te6edf3interfaceTb4b4b4)Tb4b4b4;
Tff7b72static Tffa657void Td2a8ffregister_local_client_interfaceTb4b4b4(Te6edf3InterfaceTff7b72& Te6edf3interfaceTb4b4b4)Tb4b4b4;
Tff7b72inline Tff7b72static Tff7b72const Te6edf3stdTff7b72:Tff7b72:Te6edf3mapTff7b72<Te6edf3BytesTb4b4b4, Te6edf3InterfaceTff7b72&Tff7b72> Te6edf3get_interfacesTb4b4b4(Tb4b4b4) Tb4b4b4{ Tff7b72return Te6edf3_interfacesTb4b4b4; Tb4b4b4}
Tff7b72static Tffa657void Te6edf3register_destinationTb4b4b4(Te6edf3DestinationTff7b72& Te6edf3destinationTb4b4b4)Tb4b4b4;
Tff7b72static Tffa657void Td2a8ffderegister_destinationTb4b4b4(Tff7b72const Te6edf3DestinationTff7b72& Te6edf3destinationTb4b4b4)Tb4b4b4;
Tff7b72static Tffa657void Td2a8ffregister_linkTb4b4b4(Te6edf3LinkTff7b72& Te6edf3linkTb4b4b4)Tb4b4b4;
Tff7b72static Tffa657void Td2a8ffactivate_linkTb4b4b4(Te6edf3LinkTff7b72& Te6edf3linkTb4b4b4)Tb4b4b4;
Tff7b72static Tffa657void Td2a8ffregister_announce_handlerTb4b4b4(Te6edf3HAnnounceHandler Te6edf3handlerTb4b4b4)Tb4b4b4;
Tff7b72static Tffa657void Td2a8ffderegister_announce_handlerTb4b4b4(Te6edf3HAnnounceHandler Te6edf3handlerTb4b4b4)Tb4b4b4;
Tff7b72static Te6edf3Interface Td2a8fffind_interface_from_hashTb4b4b4(Tff7b72const Te6edf3BytesTff7b72& Te6edf3interface_hashTb4b4b4)Tb4b4b4;
Tff7b72static Tffa657bool Td2a8ffshould_cache_packetTb4b4b4(Tff7b72const Te6edf3PacketTff7b72& Te6edf3packetTb4b4b4)Tb4b4b4;
Tff7b72static Tffa657bool Td2a8ffcache_packetTb4b4b4(Tff7b72const Te6edf3PacketTff7b72& Te6edf3packetTb4b4b4, Tffa657bool Te6edf3force_cache Tff7b72= Tffa657falseTb4b4b4)Tb4b4b4;
Tff7b72static Te6edf3Packet Td2a8ffget_cached_packetTb4b4b4(Tff7b72const Te6edf3BytesTff7b72& Te6edf3packet_hashTb4b4b4)Tb4b4b4;
Tff7b72static Tffa657bool Td2a8ffclear_cached_packetTb4b4b4(Tff7b72const Te6edf3BytesTff7b72& Te6edf3packet_hashTb4b4b4)Tb4b4b4;
Tff7b72static Tffa657bool Td2a8ffcache_request_packetTb4b4b4(Tff7b72const Te6edf3PacketTff7b72& Te6edf3packetTb4b4b4)Tb4b4b4;
Tff7b72static Tffa657void Td2a8ffcache_requestTb4b4b4(Tff7b72const Te6edf3BytesTff7b72& Te6edf3packet_hashTb4b4b4, Tff7b72const Te6edf3DestinationTff7b72& Te6edf3destinationTb4b4b4)Tb4b4b4;
Tff7b72static Tffa657bool Td2a8ffremove_pathTb4b4b4(Tff7b72const Te6edf3BytesTff7b72& Te6edf3destination_hashTb4b4b4)Tb4b4b4;
Tff7b72static Tffa657bool Td2a8ffhas_pathTb4b4b4(Tff7b72const Te6edf3BytesTff7b72& Te6edf3destination_hashTb4b4b4)Tb4b4b4;
Tff7b72static Tffa657uint8_t Td2a8ffhops_toTb4b4b4(Tff7b72const Te6edf3BytesTff7b72& Te6edf3destination_hashTb4b4b4)Tb4b4b4;
Tff7b72static Te6edf3Bytes Td2a8ffnext_hopTb4b4b4(Tff7b72const Te6edf3BytesTff7b72& Te6edf3destination_hashTb4b4b4)Tb4b4b4;
Tff7b72static Te6edf3Interface Td2a8ffnext_hop_interfaceTb4b4b4(Tff7b72const Te6edf3BytesTff7b72& Te6edf3destination_hashTb4b4b4)Tb4b4b4;
Tff7b72static Tffa657uint32_t Td2a8ffnext_hop_interface_bitrateTb4b4b4(Tff7b72const Te6edf3BytesTff7b72& Te6edf3destination_hashTb4b4b4)Tb4b4b4;
Tff7b72static Tffa657uint16_t Td2a8ffnext_hop_interface_hw_mtuTb4b4b4(Tff7b72const Te6edf3BytesTff7b72& Te6edf3destination_hashTb4b4b4)Tb4b4b4;
Tff7b72static Tffa657double Td2a8ffnext_hop_per_bit_latencyTb4b4b4(Tff7b72const Te6edf3BytesTff7b72& Te6edf3destination_hashTb4b4b4)Tb4b4b4;
Tff7b72static Tffa657double Td2a8ffnext_hop_per_byte_latencyTb4b4b4(Tff7b72const Te6edf3BytesTff7b72& Te6edf3destination_hashTb4b4b4)Tb4b4b4;
Tff7b72static Tffa657double Td2a8fffirst_hop_timeoutTb4b4b4(Tff7b72const Te6edf3BytesTff7b72& Te6edf3destination_hashTb4b4b4)Tb4b4b4;
Tff7b72static Tffa657double Td2a8ffextra_link_proof_timeoutTb4b4b4(Tff7b72const Te6edf3InterfaceTff7b72& Te6edf3interfaceTb4b4b4)Tb4b4b4;
Tff7b72static Tffa657bool Td2a8ffexpire_pathTb4b4b4(Tff7b72const Te6edf3BytesTff7b72& Te6edf3destination_hashTb4b4b4)Tb4b4b4;
Tff7b72static Tffa657bool Td2a8ffmark_path_unresponsiveTb4b4b4(Tff7b72const Te6edf3BytesTff7b72& Te6edf3destination_hashTb4b4b4, Tff7b72const Te6edf3BytesTff7b72& Te6edf3blocked_interface Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4)Tb4b4b4;
T8b949e//static void request_path(const Bytes& destination_hash, const Interface& on_interface = {Type::NONE}, const Bytes& tag = {}, bool recursive = false);
Tff7b72static Tffa657void Td2a8ffrequest_pathTb4b4b4(Tff7b72const Te6edf3BytesTff7b72& Te6edf3destination_hashTb4b4b4, Tff7b72const Te6edf3InterfaceTff7b72& Te6edf3on_interfaceTb4b4b4, Tff7b72const Te6edf3BytesTff7b72& Te6edf3tag Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4, Tffa657bool Te6edf3recursive Tff7b72= Tffa657falseTb4b4b4)Tb4b4b4;
Tff7b72static Tffa657void Td2a8ffrequest_pathTb4b4b4(Tff7b72const Te6edf3BytesTff7b72& Te6edf3destination_hashTb4b4b4)Tb4b4b4;
Tff7b72static Tffa657void Td2a8ffpath_request_handlerTb4b4b4(Tff7b72const Te6edf3BytesTff7b72& Te6edf3dataTb4b4b4, Tff7b72const Te6edf3PacketTff7b72& Te6edf3packetTb4b4b4)Tb4b4b4;
Tff7b72static Tffa657void Td2a8ffpath_requestTb4b4b4(Tff7b72const Te6edf3BytesTff7b72& Te6edf3destination_hashTb4b4b4, Tffa657bool Te6edf3is_from_local_clientTb4b4b4, Tff7b72const Te6edf3InterfaceTff7b72& Te6edf3attached_interfaceTb4b4b4, Tff7b72const Te6edf3BytesTff7b72& Te6edf3requestor_transport_id Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4, Tff7b72const Te6edf3BytesTff7b72& Te6edf3tag Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72static Tffa657bool Td2a8ffdetach_interfacesTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72static Tffa657void Td2a8ffdrop_announce_queuesTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72static Tffa657uint64_t Td2a8ffannounce_emittedTb4b4b4(Tff7b72const Te6edf3PacketTff7b72& Te6edf3packetTb4b4b4)Tb4b4b4;
Tff7b72static Tffa657void Td2a8ffwrite_packet_hashlistTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72static Tffa657bool Td2a8ffread_path_tableTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72static Tffa657bool Td2a8ffwrite_path_tableTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72static Tffa657void Td2a8ffread_tunnel_tableTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72static Tffa657void Td2a8ffwrite_tunnel_tableTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72static Tffa657void Td2a8ffpersist_dataTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72static Tffa657void Td2a8ffclean_cachesTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72static Tffa657void Td2a8ffclear_caches_in_memoryTb4b4b4(Tb4b4b4)Tb4b4b4; T8b949e// aggressive in-memory cache clearing for heap pressure
Tff7b72static Tffa657void Td2a8ffdump_statsTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72static Tffa657void Td2a8ffdump_whitelistsTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72static Tffa657void Td2a8ffexit_handlerTb4b4b4(Tb4b4b4)Tb4b4b4;

Tff7b72static Tffa657uint16_t Td2a8ffremove_reverse_entriesTb4b4b4(Tff7b72const Te6edf3stdTff7b72:Tff7b72:Te6edf3vectorTff7b72<Te6edf3BytesTff7b72>Tff7b72& Te6edf3hashesTb4b4b4)Tb4b4b4;
Tff7b72static Tffa657uint16_t Td2a8ffremove_linksTb4b4b4(Tff7b72const Te6edf3stdTff7b72:Tff7b72:Te6edf3vectorTff7b72<Te6edf3BytesTff7b72>Tff7b72& Te6edf3hashesTb4b4b4)Tb4b4b4;
Tff7b72static Tffa657uint16_t Td2a8ffremove_pathsTb4b4b4(Tff7b72const Te6edf3stdTff7b72:Tff7b72:Te6edf3vectorTff7b72<Te6edf3BytesTff7b72>Tff7b72& Te6edf3hashesTb4b4b4)Tb4b4b4;
Tff7b72static Tffa657uint16_t Td2a8ffremove_discovery_path_requestsTb4b4b4(Tff7b72const Te6edf3stdTff7b72:Tff7b72:Te6edf3vectorTff7b72<Te6edf3BytesTff7b72>Tff7b72& Te6edf3hashesTb4b4b4)Tb4b4b4;
Tff7b72static Tffa657uint16_t Td2a8ffremove_tunnelsTb4b4b4(Tff7b72const Te6edf3stdTff7b72:Tff7b72:Te6edf3vectorTff7b72<Te6edf3BytesTff7b72>Tff7b72& Te6edf3hashesTb4b4b4)Tb4b4b4;

Tff7b72static Te6edf3Destination Td2a8fffind_destination_from_hashTb4b4b4(Tff7b72const Te6edf3BytesTff7b72& Te6edf3destination_hashTb4b4b4)Tb4b4b4;
Tff7b72static Tffa657bool Td2a8ffis_whitelisted_packet_addressTb4b4b4(Tff7b72const Te6edf3BytesTff7b72& Te6edf3destination_hashTb4b4b4)Tb4b4b4;
Tff7b72static Tffa657bool Td2a8ffpacket_contains_whitelisted_addressTb4b4b4(Tff7b72const Te6edf3PacketTff7b72& Te6edf3packetTb4b4b4)Tb4b4b4;
Tff7b72static Tff7b72const Tffa657charTff7b72* Td2a8ffpacket_whitelist_annotationTb4b4b4(Tff7b72const Te6edf3PacketTff7b72& Te6edf3packetTb4b4b4)Tb4b4b4;

T8b949e// CBA
Tff7b72static Tffa657void Td2a8ffcull_path_tableTb4b4b4(Tb4b4b4)Tb4b4b4;

T8b949e/// Select the best non-expired path for a destination by score = bitrate/(hops+1).
T8b949e/// Returns nullptr if no valid path exists.
Tff7b72static Tff7b72const Te6edf3PathEntryTff7b72* Td2a8ffselect_pathTb4b4b4(Tff7b72const Te6edf3BytesTff7b72& Te6edf3destination_hashTb4b4b4)Tb4b4b4;

T8b949e/// Return all non-expired path entries for a destination, sorted by
T8b949e/// score descending (best first). Used by outbound hedging to walk
T8b949e/// paths in quality order, stopping at the first fresh one.
Tff7b72static Te6edf3stdTff7b72:Tff7b72:Te6edf3vectorTff7b72<Te6edf3PathEntryTff7b72> Te6edf3select_all_pathsTb4b4b4(Tff7b72const Te6edf3BytesTff7b72& Te6edf3destination_hashTb4b4b4)Tb4b4b4;

T8b949e// getters/setters
Tff7b72static Tff7b72inline Tffa657void Td2a8ffset_receive_packet_callbackTb4b4b4(Te6edf3CallbacksTff7b72:Tff7b72:Te6edf3receive_packet Te6edf3callbackTb4b4b4) Tb4b4b4{ Te6edf3_callbacksTb4b4b4.Te6edf3_receive_packet Tff7b72= Te6edf3callbackTb4b4b4; Tb4b4b4}
Tff7b72static Tff7b72inline Tffa657void Td2a8ffset_transmit_packet_callbackTb4b4b4(Te6edf3CallbacksTff7b72:Tff7b72:Te6edf3transmit_packet Te6edf3callbackTb4b4b4) Tb4b4b4{ Te6edf3_callbacksTb4b4b4.Te6edf3_transmit_packet Tff7b72= Te6edf3callbackTb4b4b4; Tb4b4b4}
Tff7b72static Tff7b72inline Tffa657void Td2a8ffset_filter_packet_callbackTb4b4b4(Te6edf3CallbacksTff7b72:Tff7b72:Te6edf3filter_packet Te6edf3callbackTb4b4b4) Tb4b4b4{ Te6edf3_callbacksTb4b4b4.Te6edf3_filter_packet Tff7b72= Te6edf3callbackTb4b4b4; Tb4b4b4}
Tff7b72static Tff7b72inline Tff7b72const Te6edf3ReticulumTff7b72& Td2a8ffreticulumTb4b4b4(Tb4b4b4) Tb4b4b4{ Tff7b72return Te6edf3_ownerTb4b4b4; Tb4b4b4}
Tff7b72static Tff7b72inline Tff7b72const Te6edf3IdentityTff7b72& Td2a8ffidentityTb4b4b4(Tb4b4b4) Tb4b4b4{ Tff7b72return Te6edf3_identityTb4b4b4; Tb4b4b4}
Tff7b72inline Tff7b72static Tffa657uint16_t Td2a8ffpath_table_maxsizeTb4b4b4(Tb4b4b4) Tb4b4b4{ Tff7b72return Te6edf3_path_table_maxsizeTb4b4b4; Tb4b4b4}
Tff7b72inline Tff7b72static Tffa657void Td2a8ffpath_table_maxsizeTb4b4b4(Tffa657uint16_t Te6edf3path_table_maxsizeTb4b4b4) Tb4b4b4{ Te6edf3_path_table_maxsize Tff7b72= Te6edf3path_table_maxsizeTb4b4b4; Tb4b4b4}
Tff7b72inline Tff7b72static Tffa657uint16_t Td2a8ffprobe_destination_enabledTb4b4b4(Tb4b4b4) Tb4b4b4{ Tff7b72return Te6edf3_path_table_maxpersistTb4b4b4; Tb4b4b4}
Tff7b72inline Tff7b72static Tffa657void Td2a8ffpath_table_maxpersistTb4b4b4(Tffa657uint16_t Te6edf3path_table_maxpersistTb4b4b4) Tb4b4b4{ Te6edf3_path_table_maxpersist Tff7b72= Te6edf3path_table_maxpersistTb4b4b4; Tb4b4b4}
T8b949e// CBA TEST
Tff7b72static Tff7b72inline Tffa657void Td2a8ffidentityTb4b4b4(Te6edf3IdentityTff7b72& Te6edf3identityTb4b4b4) Tb4b4b4{ Te6edf3_identity Tff7b72= Te6edf3identityTb4b4b4; Tb4b4b4}

Tff7b72inline Tff7b72static Tff7b72const Te6edf3stdTff7b72:Tff7b72:Te6edf3mapTff7b72<Te6edf3BytesTb4b4b4, Te6edf3stdTff7b72:Tff7b72:Te6edf3dequeTff7b72<Te6edf3PathEntryTff7b72>Tff7b72>Tff7b72& Te6edf3get_destination_tableTb4b4b4(Tb4b4b4) Tb4b4b4{ Tff7b72return Te6edf3_destination_tableTb4b4b4; Tb4b4b4}
Tff7b72inline Tff7b72static Tff7b72const Te6edf3stdTff7b72:Tff7b72:Te6edf3vectorTff7b72<Te6edf3stdTff7b72:Tff7b72:Te6edf3pairTff7b72<Te6edf3BytesTb4b4b4, Te6edf3RateEntryTff7b72>Tff7b72>Tff7b72& Te6edf3get_announce_rate_tableTb4b4b4(Tb4b4b4) Tb4b4b4{ Tff7b72return Te6edf3_announce_rate_tableTb4b4b4; Tb4b4b4}
Tff7b72inline Tff7b72static Tff7b72const Te6edf3stdTff7b72:Tff7b72:Te6edf3mapTff7b72<Te6edf3BytesTb4b4b4, Te6edf3LinkEntryTff7b72>Tff7b72& Te6edf3get_link_tableTb4b4b4(Tb4b4b4) Tb4b4b4{ Tff7b72return Te6edf3_link_tableTb4b4b4; Tb4b4b4}

Te6edf3privateTff7b72:
T8b949e// CBA MUST use references to interfaces here in order for virtul overrides for send/receive to work
Tff7b72#Tff7b72if defined(INTERFACES_SET)
T8b949e// set sorted, can use find
T8b949e//static std::set<std::reference_wrapper<const Interface>, std::less<const Interface>> _interfaces; // All active interfaces
Tff7b72static Te6edf3stdTff7b72:Tff7b72:Te6edf3setTff7b72<Te6edf3stdTff7b72:Tff7b72:Te6edf3reference_wrapperTff7b72<Te6edf3InterfaceTff7b72>Tb4b4b4, Te6edf3stdTff7b72:Tff7b72:Te6edf3lessTff7b72<Te6edf3InterfaceTff7b72>Tff7b72> Te6edf3_interfacesTb4b4b4; T8b949e// All active interfaces
Tff7b72#Tff7b72elif defined(INTERFACES_LIST)
T8b949e// list is unsorted, can't use find
Tff7b72static Te6edf3stdTff7b72:Tff7b72:Te6edf3listTff7b72<Te6edf3stdTff7b72:Tff7b72:Te6edf3reference_wrapperTff7b72<Te6edf3InterfaceTff7b72>Tff7b72> Te6edf3_interfacesTb4b4b4; T8b949e// All active interfaces
Tff7b72#Tff7b72elif defined(INTERFACES_MAP)
T8b949e// map is sorted, can use find
Tff7b72static Te6edf3stdTff7b72:Tff7b72:Te6edf3mapTff7b72<Te6edf3BytesTb4b4b4, Te6edf3InterfaceTff7b72&Tff7b72> Te6edf3_interfacesTb4b4b4; T8b949e// All active interfaces
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72if defined(DESTINATIONS_SET)
Tff7b72static Te6edf3stdTff7b72:Tff7b72:Te6edf3setTff7b72<Te6edf3DestinationTff7b72> Te6edf3_destinationsTb4b4b4; T8b949e// All active destinations
Tff7b72#Tff7b72elif defined(DESTINATIONS_MAP)
Tff7b72static Te6edf3stdTff7b72:Tff7b72:Te6edf3mapTff7b72<Te6edf3BytesTb4b4b4, Te6edf3DestinationTff7b72> Te6edf3_destinationsTb4b4b4; T8b949e// All active destinations
Tff7b72#Tff7b72endif
T8b949e// CBA TODO: Reconsider using std::set for enforcing uniqueness. Maybe consider std::map keyed on hash instead
Tff7b72static Te6edf3stdTff7b72:Tff7b72:Te6edf3setTff7b72<Te6edf3LinkTff7b72> Te6edf3_pending_linksTb4b4b4; T8b949e// Links that are being established
Tff7b72static Te6edf3stdTff7b72:Tff7b72:Te6edf3setTff7b72<Te6edf3LinkTff7b72> Te6edf3_active_linksTb4b4b4; T8b949e// Links that are active
Tff7b72static Te6edf3stdTff7b72:Tff7b72:Te6edf3vectorTff7b72<Te6edf3BytesTff7b72> Te6edf3_packet_hashlistTb4b4b4; T8b949e// Flat vector for duplicate detection (linear search, no fragmentation)
Tff7b72static Te6edf3stdTff7b72:Tff7b72:Te6edf3listTff7b72<Te6edf3PacketReceiptTff7b72> Te6edf3_receiptsTb4b4b4; T8b949e// Receipts of all outgoing packets for proof processing

T8b949e// TODO: "destination_table" should really be renamed to "path_table"
T8b949e// Notes on memory usage: 1 megabyte of memory can store approximately
T8b949e// 55.100 path table entries or approximately 22.300 link table entries.

Tff7b72static Te6edf3stdTff7b72:Tff7b72:Te6edf3mapTff7b72<Te6edf3BytesTb4b4b4, Te6edf3AnnounceEntryTff7b72> Te6edf3_announce_tableTb4b4b4; T8b949e// A table for storing announces currently waiting to be retransmitted
T8b949e// Multi-path path table: dest_hash → deque of PathEntry (newest-first, max N=3)
Tff7b72static Te6edf3stdTff7b72:Tff7b72:Te6edf3mapTff7b72<Te6edf3BytesTb4b4b4, Te6edf3stdTff7b72:Tff7b72:Te6edf3dequeTff7b72<Te6edf3PathEntryTff7b72>Tff7b72> Te6edf3_destination_tableTb4b4b4;
T8b949e// Global anti-replay blob vector (capped at MAX_GLOBAL_BLOBS, linear search OK at N=8)
Tff7b72static Te6edf3stdTff7b72:Tff7b72:Te6edf3vectorTff7b72<Te6edf3BytesTff7b72> Te6edf3_global_blobsTb4b4b4;
Tff7b72static Te6edf3stdTff7b72:Tff7b72:Te6edf3vectorTff7b72<Te6edf3stdTff7b72:Tff7b72:Te6edf3pairTff7b72<Te6edf3BytesTb4b4b4, Te6edf3ReverseEntryTff7b72>Tff7b72> Te6edf3_reverse_tableTb4b4b4; T8b949e// Flat vector for proof/reply routing (no tree nodes)
Tff7b72static Te6edf3stdTff7b72:Tff7b72:Te6edf3mapTff7b72<Te6edf3BytesTb4b4b4, Te6edf3LinkEntryTff7b72> Te6edf3_link_tableTb4b4b4; T8b949e// A lookup table containing hops for links
Tff7b72static Te6edf3stdTff7b72:Tff7b72:Te6edf3mapTff7b72<Te6edf3BytesTb4b4b4, Te6edf3AnnounceEntryTff7b72> Te6edf3_held_announcesTb4b4b4; T8b949e// A table containing temporarily held announce-table entries
Tff7b72static Te6edf3stdTff7b72:Tff7b72:Te6edf3setTff7b72<Te6edf3HAnnounceHandlerTff7b72> Te6edf3_announce_handlersTb4b4b4; T8b949e// A table storing externally registered announce handlers
Tff7b72static Te6edf3stdTff7b72:Tff7b72:Te6edf3mapTff7b72<Te6edf3BytesTb4b4b4, Te6edf3TunnelEntryTff7b72> Te6edf3_tunnelsTb4b4b4; T8b949e// A table storing tunnels to other transport instances
Tff7b72static Te6edf3stdTff7b72:Tff7b72:Te6edf3vectorTff7b72<Te6edf3stdTff7b72:Tff7b72:Te6edf3pairTff7b72<Te6edf3BytesTb4b4b4, Te6edf3RateEntryTff7b72>Tff7b72> Te6edf3_announce_rate_tableTb4b4b4; T8b949e// Flat vector for announce rate tracking (no tree nodes)
Tff7b72static Te6edf3stdTff7b72:Tff7b72:Te6edf3vectorTff7b72<Te6edf3stdTff7b72:Tff7b72:Te6edf3pairTff7b72<Te6edf3BytesTb4b4b4, Tffa657doubleTff7b72>Tff7b72> Te6edf3_path_requestsTb4b4b4; T8b949e// Flat vector for path request timestamps (no tree nodes)

Tff7b72static Te6edf3stdTff7b72:Tff7b72:Te6edf3vectorTff7b72<Te6edf3stdTff7b72:Tff7b72:Te6edf3pairTff7b72<Te6edf3BytesTb4b4b4, Te6edf3PathRequestEntryTff7b72>Tff7b72> Te6edf3_discovery_path_requestsTb4b4b4; T8b949e// Flat vector for waiting path requests (no tree nodes)
Tff7b72static Te6edf3stdTff7b72:Tff7b72:Te6edf3setTff7b72<Te6edf3BytesTff7b72> Te6edf3_discovery_pr_tagsTb4b4b4; T8b949e// A table for keeping track of tagged path requests

T8b949e// Transport control destinations are used
T8b949e// for control purposes like path requests
Tff7b72static Te6edf3stdTff7b72:Tff7b72:Te6edf3setTff7b72<Te6edf3DestinationTff7b72> Te6edf3_control_destinationsTb4b4b4;
Tff7b72static Te6edf3stdTff7b72:Tff7b72:Te6edf3setTff7b72<Te6edf3BytesTff7b72> Te6edf3_control_hashesTb4b4b4;

T8b949e// Interfaces for communicating with
T8b949e// local clients connected to a shared
T8b949e// Reticulum instance


Tff7b72static Te6edf3stdTff7b72:Tff7b72:Te6edf3mapTff7b72<Te6edf3BytesTb4b4b4, Te6edf3BytesTff7b72> Te6edf3_pending_local_path_requestsTb4b4b4;

T8b949e// CBA
Tff7b72static Te6edf3stdTff7b72:Tff7b72:Te6edf3mapTff7b72<Te6edf3BytesTb4b4b4, Te6edf3PacketEntryTff7b72> Te6edf3_packet_tableTb4b4b4; T8b949e// A lookup table containing announce packets for known paths
Tff7b72static Te6edf3stdTff7b72:Tff7b72:Te6edf3setTff7b72<Te6edf3BytesTff7b72> Te6edf3_known_cached_packet_hashesTb4b4b4; T8b949e// Packet hashes confirmed cached in this boot



Tff7b72static Tffa657double Te6edf3_start_timeTb4b4b4;
Tff7b72static Tffa657bool Te6edf3_jobs_lockedTb4b4b4;
Tff7b72static Tffa657bool Te6edf3_jobs_runningTb4b4b4;
Tff7b72static Tffa657float Te6edf3_job_intervalTb4b4b4;
Tff7b72static Tffa657double Te6edf3_jobs_last_runTb4b4b4;
Tff7b72static Tffa657double Te6edf3_links_last_checkedTb4b4b4;
Tff7b72static Tffa657float Te6edf3_links_check_intervalTb4b4b4;
Tff7b72static Tffa657double Te6edf3_receipts_last_checkedTb4b4b4;
Tff7b72static Tffa657float Te6edf3_receipts_check_intervalTb4b4b4;
Tff7b72static Tffa657double Te6edf3_announces_last_checkedTb4b4b4;
Tff7b72static Tffa657float Te6edf3_announces_check_intervalTb4b4b4;
Tff7b72static Tffa657double Te6edf3_tables_last_culledTb4b4b4;
Tff7b72static Tffa657float Te6edf3_tables_cull_intervalTb4b4b4;
Tff7b72static Tffa657bool Te6edf3_saving_path_tableTb4b4b4;
Tff7b72static Tffa657uint16_t Te6edf3_hashlist_maxsizeTb4b4b4;
Tff7b72static Tffa657uint16_t Te6edf3_max_pr_tagsTb4b4b4;

T8b949e// CBA
Tff7b72static Tffa657uint16_t Te6edf3_path_table_maxsizeTb4b4b4;
Tff7b72static Tffa657uint16_t Te6edf3_path_table_maxpersistTb4b4b4;
Tff7b72static Tffa657double Te6edf3_last_savedTb4b4b4;
Tff7b72static Tffa657float Te6edf3_save_intervalTb4b4b4;
Tff7b72static Tffa657uint32_t Te6edf3_destination_table_crcTb4b4b4;

Tff7b72static Te6edf3Reticulum Te6edf3_ownerTb4b4b4;
Tff7b72static Te6edf3Identity Te6edf3_identityTb4b4b4;

T8b949e// CBA
Tff7b72static Te6edf3Callbacks Te6edf3_callbacksTb4b4b4;

T8b949e// CBA Stats
Tff7b72static Tffa657uint32_t Te6edf3_packets_sentTb4b4b4;
Tff7b72static Tffa657uint32_t Te6edf3_packets_receivedTb4b4b4;
Tff7b72static Tffa657uint32_t Te6edf3_destinations_addedTb4b4b4;
Tff7b72static Tffa657size_t Te6edf3_last_memoryTb4b4b4;
Tff7b72static Tffa657size_t Te6edf3_last_flashTb4b4b4;
Tb4b4b4}Tb4b4b4;

Te6edf3template Tff7b72<Te6edf3typename Te6edf3MTb4b4b4, Te6edf3typename Te6edf3STff7b72>
Tffa657void Te6edf3MapToValuesTb4b4b4(Tff7b72const Te6edf3MTff7b72& Te6edf3mTb4b4b4, Te6edf3STff7b72& Te6edf3sTb4b4b4) Tb4b4b4{
Tff7b72for Tb4b4b4(Te6edf3typename Te6edf3MTff7b72:Tff7b72:Te6edf3const_iterator Te6edf3it Tff7b72= Te6edf3mTb4b4b4.Te6edf3beginTb4b4b4(Tb4b4b4)Tb4b4b4; Te6edf3it Tff7b72!Tff7b72= Te6edf3mTb4b4b4.Te6edf3endTb4b4b4(Tb4b4b4)Tb4b4b4; Tff7b72+Tff7b72+Te6edf3itTb4b4b4) Tb4b4b4{
Te6edf3sTb4b4b4.Te6edf3insertTb4b4b4(Te6edf3itTff7b72-Tff7b72>Te6edf3secondTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}

Te6edf3template Tff7b72<Te6edf3typename Te6edf3MTb4b4b4, Te6edf3typename Te6edf3STff7b72>
Tffa657void Te6edf3MapToPairsTb4b4b4(Tff7b72const Te6edf3MTff7b72& Te6edf3mTb4b4b4, Te6edf3STff7b72& Te6edf3sTb4b4b4) Tb4b4b4{
Tff7b72for Tb4b4b4(Te6edf3typename Te6edf3MTff7b72:Tff7b72:Te6edf3const_iterator Te6edf3it Tff7b72= Te6edf3mTb4b4b4.Te6edf3beginTb4b4b4(Tb4b4b4)Tb4b4b4; Te6edf3it Tff7b72!Tff7b72= Te6edf3mTb4b4b4.Te6edf3endTb4b4b4(Tb4b4b4)Tb4b4b4; Tff7b72+Tff7b72+Te6edf3itTb4b4b4) Tb4b4b4{
Te6edf3sTb4b4b4.Te6edf3push_backTb4b4b4(Tff7b72*Te6edf3itTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Served by rngit 1.4.2 - Generated in 0.14s